package chenji.gunapi.untl.nbt;

import org.bukkit.inventory.ItemStack;
import chenji.gunapi.untl.asm.AsmManager;
/**
 * 
 * @author ChenJi
 *
 */
public abstract class NMSItem {
	/**
	 * 获取NMSItem实例
	 * 
	 * @param item
	 *            BukkitItemStack
	 * @return NMSItem
	 */
	public static NMSItem getNMSItem(ItemStack item) {
		try {
			return AsmManager.getAsmManager().getNMSItemCopyClass().newInstance().setItem(item);
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	abstract NMSItem setItem(ItemStack i);

	/**
	 * 获取NBTTagCompound的Object引用形式。
	 * 
	 * @return NBTTagCompound
	 */
	public abstract Object getNBTTagCompound();

	/**
	 * 获取nms ItemStack的Object引用形式。
	 * 
	 * @return NMS ItemStack
	 */
	public abstract Object getNMSItemStack();

	/**
	 * 获取最终的ItemStack
	 * 
	 * @return ItemStack
	 */
	public abstract ItemStack getItem();

	/**
	 * 为这个物品添加一个String类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setString(String path, String s);

	/**
	 * 为这个物品添加一个Short类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setShort(String path, short s);

	/**
	 * 为这个物品添加一个Integer类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setInteger(String path, int s);

	/**
	 * 为这个物品添加一个Long类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setLong(String path, long s);

	/**
	 * 为这个物品添加一个Boolean类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setBoolean(String path, boolean s);

	/**
	 * 为这个物品添加一个Double类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setDouble(String path, double s);

	/**
	 * 为这个物品添加一个Float类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setFloat(String path, float s);

	/**
	 * 为这个物品添加一个Byte[]类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setByteArray(String path, byte[] s);

	/**
	 * 为这个物品添加一个Integer[]类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setIntegerArray(String path, int[] s);

	/**
	 * 为这个物品添加一个Byte类型的NBT记录
	 * 
	 * @param path
	 *            路径
	 * @param s
	 *            内容
	 * @return 自身
	 */
	public abstract NMSItem setByte(String path, byte b);

	/**
	 * 从NBT记录中读取一个Integer类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract int getInteger(String path);

	/**
	 * 从NBT记录中读取一个Long类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract long getLong(String path);

	/**
	 * 从NBT记录中读取一个Boolean类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract boolean getBoolean(String path);

	/**
	 * 从NBT记录中读取一个Double类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract double getDouble(String path);

	/**
	 * 从NBT记录中读取一个Float类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract float getFloat(String path);

	/**
	 * 从NBT记录中读取一个ByteArray类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract byte[] getByteArray(String path);

	/**
	 * 从NBT记录中读取一个IntegerArray类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract int[] getIntegerArray(String path);

	/**
	 * 从NBT记录中读取一个Byte类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract byte getByte(String path);

	/**
	 * 从NBT记录中读取一个String类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract String getString(String path);

	/**
	 * 从NBT记录中读取一个Short类型的数据
	 * 
	 * @param path
	 *            路径
	 * @return 值
	 */
	public abstract short getShort(String path);
}
